package org.finesys.common.netty.websocket.resolver;

import java.util.Optional;

import org.finesys.common.netty.websocket.annotation.OnError;
import org.finesys.common.netty.websocket.support.MethodArgumentResolver;
import org.springframework.core.MethodParameter;

import io.netty.channel.Channel;

public class ThrowableMethodArgumentResolver implements MethodArgumentResolver {

    /**
     * 重写support方法以判断是否支持给定的方法参数。
     *
     * 如果方法参数所属的方法上标注了@OnError注解，并且方法参数的类型是Throwable或其子类，
     * 则此方法返回true，表示支持该参数；否则返回false。
     *
     * @param parameter 方法参数，包含方法参数的元数据。
     * @return 如果支持给定的方法参数，则返回true；否则返回false。
     */
    @Override
    public boolean support(MethodParameter parameter) {
         return Optional.ofNullable(parameter).map(MethodParameter::getMethod)
            .filter(s->s.isAnnotationPresent(OnError.class))
            .filter(s->Throwable.class.isAssignableFrom(parameter.getParameterType())).isPresent();
    }

    /**
     * 重写resolveArgument方法以解析方法参数。
     *
     * 如果传入的object参数是Throwable或其子类的实例，则直接返回该对象；
     * 否则，返回null。
     *
     * @param parameter 方法参数，包含方法参数的元数据。
     * @param channel   WebSocket通道，用于处理WebSocket连接。
     * @param object     可能为Throwable实例的上下文对象。
     * @return 如果object是Throwable实例，则返回该实例；否则返回null。
     * @throws Exception 如果在解析参数过程中发生异常，则抛出该异常。
     */
    @Override
    public Object resolveArgument(MethodParameter parameter, Channel channel, Object object) throws Exception {
        if (object instanceof Throwable) {
            return object;
        }
        return null;
    }
}
